<?php

namespace App\Http\Controllers;

use App\Http\Middleware\LoginAuth;
// 引入User请求验证
use App\Http\Requests\UserRequest;
// 引入User模型
use App\Models\User\User;
// 必须要引用请求对象类
use Illuminate\Http\Request;
// 必须要引用Cookie对象类
use Illuminate\Support\Facades\Cookie;
// 引入DB类
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;

class UserController extends Controller
{
    public function __construct()
    {
        // parent::__construct();

        // $this->middleware(LoginAuth::class);
        // 用户控制器所有方法都应用该中间件
        // $this->middleware('LoginAuth');

        //  只有index方法应用了LoginAuth的中间件
        // $this->middleware('LoginAuth')->only('index');

        // 除了index方法 其他应用该中间件
        // $this->middleware('LoginAuth')->except(['index','show','add']);
    }
    // 用户首页
    public function index()
    {
        // // 查询所有的用户数据
        $UserList = DB::table('user')->get();

        // // 赋值
        // $data = compact([
        //     'UserList'
        // ]);

        // // view => 第一个参数指向哪个页面 第二个参数 把控制器的数据赋值给视图使用
        // return view('user.index', $data);

        // view => 第一个参数指向哪个页面 第二个参数 把控制器的数据赋值给视图使用
        return view('user.index',['name' => '用户首页','test' => '','data' => ['email' => '1@qq.com'],'i' => 1,'user' => $UserList]);
    }

    public function add(Request $request)
    {
        // // 获取输入的值
        // $username = $request->input('username');
        // dump($username);

        // // 获取请求路径
        // $uri = $request->path();
        // dump($uri);

        // // 获取请求地址
        // $url = $request->url();

        // dump($url);

        // // 获取请求方法
        // $method = $request->method();
        // dump($method);

        // 判断请求类型
        // if($request->isMethod('post'))
        // {
        //     echo '这是POST请求';
        // }

        // $input = $request->all();
        // dump($input);

        // $name = $request->input('name','demo');
        // dump($name);
        

        // $params = $request->input();

        // dump($params);

        // $keyword = $request->query('keyword');
        // dump($keyword);

        // $sex = $request->boolean('sex');
        // dump($sex);

        // $input = $request->only(['username','nickname']);
        // dump($input);

        // $params = $request->except(['name','keyword']);
        // dump($params);

        // if($request->has('name'))
        // {
        //     echo $request->input('name');
        // }

        // if($request->filled('password'))
        // {
        //     echo 'password存在并且有值';
        // }

        // 动态属性获取值 store => 第一个参数 指定文件夹 第二个参数 指定磁盘
        // $file = $request->img->store('img','uploads');

        // dump($file);

        return view('user.add');
    }

    public function addform(UserRequest $userRequest)
    {
        // $data = $request->validate([
        //     'username' => 'required',
        //     'password' => ['required','min:6','max:10']
        // ]);

        // dump($data);

        // 验证规则
        // $rules = [
        //     'email' => 'required|unique:user',// email字段必填 验证是否唯一
        //     'password' => ['required','min:6','max:10'],// password 字段必填 输入长度至少6个字符 最长10个字符
        // ];

        // // 自定义错误信息
        // $message = [
        //     'email.required' => '用户名必填',
        //     'email.unique' => '该用户名已注册，请重新输入',
        //     'password.required' => '密码必填',
        //     'password.min' => '密码必须至少为 6 个字符',
        //     'password.max' => '密码最大长度为 10 个字符'
        // ];

        $email = $userRequest->old('email');
        $password = $userRequest->old('password');

        // $validator = Validator::make($request->all(),$rules,$message);

        // if($validator->fails())
        // {
        //     return redirect('admin/user/add')->withErrors($validator)->withInput();
        // }

        // dump($validator);

        $Validated = $userRequest->validated();

        dump($Validated);
    }

    // Request $request => 依赖注入 id => 路由参数
    public function show(Request $request)
    {

        // 获取设置好的cookie
        // $User = Cookie::get('LoginUser');

        // dump($User);

        // if(Cookie::has('LoginUser'))
        // {
        //     echo '已登录';
        // }else{
        //     echo '未登录';
        // }

        // $LoginUser = $request->session()->get('LoginUser');

        // $all = $request->session()->all();

        // 获取session,如果获取不存在那么就会给默认值
        // $test = $request->session()->get('test', 'default');

        // dump($test);

        if($request->isMethod('post'))
        {
            // 验证规则
            $rules = [
                'captcha' => 'required|captcha'
            ];

            // 自定义错误信息
            $message = [
                'captcha.required' => '验证码必填',
                'captcha.captcha' => '验证码错误，请重新输入'
            ];

            $validator = Validator::make($request->all(),$rules,$message);

            if($validator->fails())
            {
                return redirect('show')->withErrors($validator)->withInput();
            }
        }

        // 设置每页都只是显示10条数据
        $region = DB::table('region')->paginate(10);



        return view('test',['region' => $region]);
    }

    public function test(Request $request)
    {
        // 模拟用户登录后需要存储的信息
        // $data = [
        //     'id' => 1,
        //     'nickname' => 'demo'
        // ];

        // // Cookie只能设置字符串的值，数组需要转成json数据
        // $DataJson = json_encode($data);

        // // 写入cookie 第一个参数 cookie名称 第二个参数 cookie的值
        // $Cookie = Cookie::make('LoginUser',$DataJson);

        // // 加入队列
        // Cookie::queue($Cookie);

        // 设置session

        // $request->session()->put('LoginUser',['id' => 1,'nickname' => 'admin']);

        // session(['key' => 'value']);

        /* 
            config/database.php => 数据库配置文件

            .env 环境变量文件 如果该文件存在的话,框架会优先读取,只有项目上线后读取config/database.php
        */

        // SELECT 查询数据 原生查询 ? => 参数绑定
        // $user = DB::select('SELECT * FROM `pre_user` WHERE `id` = ?',['2']);

        // 使用命名绑定
        $user = DB::select('SELECT * FROM `pre_user` WHERE `id` = :id',['id' => '1']);

        // 例如获取用户的昵称 select => 返回一个stdClass 对象
        // echo $user[0]->nickname;

        // 用循环
        // foreach ($user as $key => $user) {
        //     echo $user->nickname;
        // }

        // 插入
        // DB::insert('INSERT INTO `pre_user`(`nickname`,`email`)VALUES(:nickname,:email)',['nickname' => 'demo','email' => '12345@qq.com']);

        // 更新
        // DB::update('UPDATE `pre_user` SET `sex` = :sex',['sex' => '1']);

        // 删除
        // DB::delete('DELETE FROM `pre_user` WHERE `id` = :id',['id' => 8]);

        // dump($user);

        // 当执行一些Sql语句只是返回true或者false 可以调用statement
        // DB::statement('drop table pre_jobs');

        // 事务
        // DB::transaction(function(){
        //     DB::update('UPDATE `pre_user` SET `nickname` = :nickname WHERE `id` = :id',['nickname' => 'demo','id' => '6']);

        //     DB::statement('drop table pre_users');
        // });

        // 手动开启事务
        // DB::beginTransaction();


        // 主体代码
        // $result = DB::update('UPDATE `pre_user` SET `nickname` = :nickname WHERE `id` = :id',['nickname' => 'test','id' => '3']);


        // $status = DB::statement('drop table pre_flights');

        // if($result === FALSE || $status === FALSE)
        // {
        //     echo 111;
        //     DB::rollBack();
        // }else{
        //     echo 222;
        //     DB::commit();
        // }

        // 查询
        // $user = DB::table('user')->get(); // 查询用户表所有数据
        
        // dump($user); // 返回PHP stdClass 对象

        // foreach ($user as $key => $value) {
        //     echo $value->nickname;
        // }

        // 查询单条数据 例如查询用户id为7的用户
        // $user = DB::table('user')->where(['id' => 7])->first();
        // 查询某个字段的值 例如查询id为6的用户昵称
        // $nickname = DB::table('user')->where(['id' => 6])->value('nickname');

        // 直接通过id获取一行数据
        // $user = DB::table('user')->find(6);

        // dump($user);

        // 获取一列的值
        // $nicknames = DB::table('user')->pluck('nickname');

        // dump($nicknames);

        // 聚合
        // 获取用户表一共多少个用户
        // $UserCount = DB::table('user')->count();

        // echo $UserCount;

        // 获取用户最大的id
        // $Max = DB::table('user')->max('id');

        // echo $Max;

        // 查询需要的字段
        // $user = DB::table('user')->where('id',7)->select('id','nickname as name','email','phone')->first();

        // dump($user);

        // 原生表达式
        // $user = DB::table('user')->select(DB::raw('COUNT(*) as num'),'sex')->groupBy('sex')->get();

        // dump($user);

        // 内链表 => A表跟B表数据要匹配才能查询
        // $contact = DB::table('contact')->join('type','contact.typeid','=','type.id')->get();

        // 左链表 => A表 = user B表 = contact 以A表作主表,先查询A表然后匹配B表,如果不匹配的话,A表数据全部显示,B表的数据显示null
        // $user = DB::table('user')->leftJoin('contact','user.id','=','contact.userid')->get();

        // 右链表 => A表 = contact B表 = type 以B表作主表,先查询B表然后匹配A表,如果不匹配的话,A表数据显示null,B表的数据全部显示
        // $contact = DB::table('contact')->rightJoin('type','contact.typeid','=','type.id')->get();

        // dump($contact);

        // 联合查询
        // $user = DB::table('user')->whereNull('email');

        // $User = DB::table('user')->whereNull('phone')->union($user)->get();

        // dump($User);

        // where 条件查询

        /* 
            第一个参数 => 字段名
            第二个参数 => 操作符 如果把指定的值作为第二个参数时，laravel会默认使用 = 操作符
            第三个参数 => 指定的值或者比较字段的值
        */
        // 查询id大于3并且sex = 1的所有数据
        $user = DB::table('user')->where('id','>',3)->where('sex','1')->get();
        // 查询id大于等于3并且sex=1的所有数据
        $user = DB::table('user')->where('id','>=',3)->where('sex','1')->get();
        // 查询id不等于并且sex=1的所有数据
        $user = DB::table('user')->where('id','<>',3)->where('sex','1')->get();
        // 模糊查询nickname为d所有数据
        $user = DB::table('user')->where('nickname','like','%d%')->get();
        // 条件数组
        $user = DB::table('user')->where([
            ['nickname','like','%d%'],
            ['sex','=','2']
        ])->get();

        // or id大于3或者sex=0
        $user = DB::table('user')->where('id','>',3)->orWhere('sex','0')->get();

        // 查询在某个范围的所有
        $user = DB::table('user')
           ->whereBetween('id', [3, 6])
           ->get();

        // 查询不在某个范围的所有
        $user = DB::table('user')
        ->whereNotBetween('id', [3, 6])
        ->get();

        // 查询id为3,5的
        $user = DB::table('user')->whereIn('id',['3',5])->get();

        // 排序
        $user = DB::table('user')->orderBy('id','desc')->get();

        // 分组
        $user = DB::table('user')->get()->groupBy('sex');

        // 限制显示多少条数据
        $user = DB::table('user')->limit(2)->get();

        // 插入数据
        // DB::table('user')->insert([
        //     'nickname' => 'bb',
        //     'email' => 'bb@qq.com',
        //     'sex' => 2
        // ]);

        // 获取自增id
        // $id = DB::table('user')->insertGetId([
        //     'nickname' => 'cc',
        //     'email' => 'ccb@qq.com',
        //     'sex' => 2
        // ]);

        // 更新
        // DB::table('user')->where('id','12')->update(['email' => 'cc@qq.com']);


        // 自增
        // DB::table('user')->increment('phone',10);

        // 删除

        // 调试 dd 会显示调试信息并终止执行请 dump 会显示调试信息并允许请求继续执行
        // DB::table('user')->where('id',12)->dump();

        // 根据[$id]主键查询 查询一条数据
        // $user = User::find(3);

        // first 方法查询一条
        // $user = User::where('id',3)->first();

        // findOrFail() 根据主键查询 如果没有查到 报错
        // $user = User::findOrFail(3);

        // 查询用户所有数据
        // $user = User::all();

        // User::chunk(3,function($data){
        //     dump($data);
        // });

        // 聚合 统计用户表有多少条数据
        // $user = User::count();

        // $user = User::max('id');

        // dump($user);


        // 调用模型插入数据

        // 实例化模型
        // $User = new User();

        // 给属性赋值
        // $User->nickname = 'abc';

        // $User->email = 'abc@qq.com';

        // 调用save方法保存数据
        // $User->save();

        // 需要插入数据库的数组
        // $data = [
        //     'nickname' => 'iii',
        //     'email' => 'iii@qq.com',
        //     'sex' => 1
        // ];


        // create 批量插入数据
        // User::create($data);

        // 更新数据


        // 先查询需要更新的那条数据出来
        // $User = User::find(10);

        // $User->phone = '13056238956';

        // $User->save();

        // 批量更新
        // $data = [
        //     'password' => 'f807a6a182cb09baff73ab4850d239c4',
        //     'salt' => 'I6bdrcJk'
        // ];

        // User::where(['id' => 10])->update($data);

        // 第一个参数属于 条件 第二个参数 属于 更新的内容
        // User::updateOrCreate(['id' => 13],['sex' => '1']);


        // 删除
        // $User = User::find(12);

        // $User->delete();

        // 查询软删除数据
        // $User = User::onlyTrashed()->find(14);

        // // dump($User);
        // // 真实删除
        // $User->forceDelete();
        
        $User = User::find(10);

        $User->nickname = 'Sally';


        dump($User);



        // dump($id);
    
    }

    public function demo(Request $request)
    {
         // 把Cookie有效时间设置成过去的时间
         $LoginUser = Cookie::forget('LoginUser');

         // 重新加入队列
         Cookie::queue($LoginUser);

        $request->session()->forget(['LoginUser','key']);

         return redirect('/');

    }
}
